<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .box1{
            width: 100px;height: 100px;background: orange;position: absolute;left: 0;top: 0;
        }
        .box2{
            width: 100px;height: 100px;background: green;position: absolute;left: 0;top: 150px;
        }
        .line{
            width: 3px;height: 500px;background: black;position: absolute;left: 500px;top: 0;
        }
    </style>
</head>
<body>
    <div class="box1"></div>
    <div class="box2"></div>
    <div class="line"></div>
</body>
<script>
    var obox1=document.querySelector(".box1");
    var obox2=document.querySelector(".box2");
    obox1.onclick=function(){
        move(obox1,{
            left:500,
            top:400,
        })
    }
    obox2.onclick=function(){
        move(obox2,{
            left:500,
            top:400,
        })
    }

    function move(ele, data){
        clearInterval(ele.t);
        ele.t = setInterval(() => {
            // 假设，计时器从一开始就不应该存在
            let flag = true;
            // 遍历对象，拿到属性和目标
            for(let i in data){
                let now = parseInt(getStyle(ele, i));
                let speed = (data[i] - now) / 7;
                speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed);
                // 如果一个属性到目标了，先别清除计时器，因为有可能其他属性还没到目标
                // 删除了原本清除计时器的代码
                ele.style[i] = now + speed + "px";
                // 只要有一个属性还没到目标，计时器就要存在
                if(data[i] !== now){
                    flag = false;
                }
            }
            // 如果没有属性没到目标（所有属性都到目标），计时器就真的不应该存在了
            if(flag){
                clearInterval(ele.t)
            }
        }, 30);
    }


    // 获取非行内样式的兼容
    function getStyle(ele, attr){
        if(getComputedStyle){
            return getComputedStyle(ele)[attr];
        }else{
            return ele.currentStyle[attr];
        }
    }
</script>
</html>